package com.hyf.serviceedu.service.impl;

import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.hyf.service.config.exception.GuliException;
import com.hyf.serviceedu.entity.EduSubject;
import com.hyf.serviceedu.entity.excel.SubjectDataExcel;
import com.hyf.serviceedu.entity.rankVo.SubjectOneVo;
import com.hyf.serviceedu.entity.rankVo.SubjectTwoVo;
import com.hyf.serviceedu.listenersExcel.SubjectExcelListener;
import com.hyf.serviceedu.mapper.EduSubjectMapper;
import com.hyf.serviceedu.service.EduSubjectService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 课程科目 服务实现类
 * </p>
 *
 * @author atguigu
 * @since 2021-04-17
 */
@Service
public class EduSubjectServiceImpl extends ServiceImpl<EduSubjectMapper, EduSubject> implements EduSubjectService {
    // 添加课程分类
    @Override
    public void saveSubject(MultipartFile file,EduSubjectService service) {
        try {
            InputStream in=file.getInputStream();
            // // 这里 需要指定读用哪个class去读，然后读取第一个sheet 文件流会自动关闭
            EasyExcel.read(in,SubjectDataExcel.class,new SubjectExcelListener(service)).sheet().doRead();
        }catch (Exception e) {
            e.printStackTrace();
            throw new GuliException(20002,"添加课程分类失败");
        }




        /*try {
            //1 获取文件输入流
            InputStream inputStream = file.getInputStream();
            // 这里 需要指定读用哪个class去读，然后读取第一个sheet 文件流会自动关闭
            EasyExcel.read(inputStream, ExcelSubjectData.class, new SubjectExcelListener(subjectService)).sheet().doRead();
        }catch(Exception e) {
            e.printStackTrace();
            throw new GuliException(20002,"添加课程分类失败");
        }*/

    }

    // 添加课程分类
  /*  @Override
    public void saveSubject(MultipartFile file,EduSubjectService service) {

        try{
            // 得到文件的输入流
            InputStream in=file.getInputStream();
            // 调用方法 进行读取
            EasyExcel.read(in, SubjectDataExcel.class,new SubjectExcelListener()).sheet().doRead();
        }catch(Exception e){
           e.printStackTrace();
        }


    }*/

    // 课程分类列表（树状）
    @Override
    public List<SubjectOneVo> getAllOneTwosubjest() {
// 查询所有的一级分类  parentid=0 一级分类
     QueryWrapper<EduSubject> wrapperOne=new QueryWrapper<>();// 先拿一个对象
       wrapperOne.eq("parent_id","0");// 先设置一个值
        List<EduSubject> eduSubjectsOne = baseMapper.selectList(wrapperOne);// 这个集合里面的数据就是我们的一级分类




        // 查询所有的二级分类 parentid ！=0 二级分类
        QueryWrapper<EduSubject> wrapperTwo=new QueryWrapper<>();// 先拿一个对象
        wrapperTwo.ne("parent_id","0");// 先设置一个值
        List<EduSubject> eduSubjectsTwo = baseMapper.selectList(wrapperTwo);// 这个集合里面的数据就是我们的二级分类



        // 创建 list 集合 ，用于封装最终数据
        List<SubjectOneVo> finaSubjectList=new ArrayList<>();

        // 封装一级分类
        // 把查询出来所有的一级分类 list集合遍历，得到每一个 一级分类对象，获取每个一级分类的对象值
        // 封装到要求的 list 集合里面 List<SubjectOne> finaSubjectList 里面
        // 写一个for 循环 遍历 eduSubjectsOne 集合
        for (int i = 0; i < eduSubjectsOne.size(); i++) {
            // 得到 eduSubjectsOne 每个 eduSubject 对象
            EduSubject eduSubject = eduSubjectsOne.get(i);

    /*  第一种方法 较麻烦的一种，适合少数字段的 类型
          // 把eduSubject 里面的值获取出来，放到 SubjectOneVo 对象里面
            // 把多个SubjectOneVo 放到 finaSubjectList 里面
            SubjectOneVo subjectOneVo=new SubjectOneVo();// new 一个实体类
            subjectOneVo.setId(eduSubject.getId());// 拿到 eduSubject 里面的值 id 值
            subjectOneVo.setTitle(eduSubject.getTitle());// 拿到 eduSubject 里面title 的值
            // 然后把值放到 finaSubjectList 里面
            finaSubjectList.add(subjectOneVo);*/
            // 把eduSubject 里面的值获取出来，放到 SubjectOneVo 对象里面
            // 把多个SubjectOneVo 放到 finaSubjectList 里面
            SubjectOneVo subjectOneVo=new SubjectOneVo();// new 一个实体类
            // eduSubject 里面的值 复制到 把多个SubjectOneVo 对象里面
            BeanUtils.copyProperties(eduSubject,subjectOneVo);
            finaSubjectList.add(subjectOneVo);

            // 封装二级分类
            // 在一级分类的循环里面遍历查询所有的二级分类
            // 创建list 集合封装 每一个 一级分类的二级分类
            List<SubjectTwoVo>  TowFinalSubjectlist=new ArrayList<>();
            // 遍历二级分类 的 list 集合
            for (int j = 0; j < eduSubjectsTwo.size(); j++) {
                // 获取每个 二级分类
                EduSubject eduSubjectTwo = eduSubjectsTwo.get(j);
                // 判断 二级分类的 id 是否和 一级分类的 id 是否一样
                if(eduSubjectTwo.getParentId().equals(eduSubject.getId())){
                    // 如果他们一样 把 eduSubjectTwo 放到 SubjectTwoVo 里面，
                    SubjectTwoVo topicTwoVo=new SubjectTwoVo();
                    BeanUtils.copyProperties(eduSubjectTwo,topicTwoVo);
                    TowFinalSubjectlist.add(topicTwoVo);

                }
            }

        // 把一级下面所有的二级分类 放到 一级分类里面
            subjectOneVo.setChildrens(TowFinalSubjectlist);

        }



        //填充二级分类vo数据




        return finaSubjectList;
    }


}
